
#ifndef SEARCHALGORITHM_HPP_
#define SEARCHALGORITHM_HPP_

#include <string.h>
#include "../logger/logger.hpp"
#include "node.hpp"
#include "graph.hpp"
#include "weight.hpp"

/**
 * Class SearchAlgorithm: encargada de la busqueda
 * del camino optimo.
 */
class SearchAlgorithm {
private:
	Logger			*logger;
	std::string		path;
	double			weight;
	List<Node>		pathList;

protected:
	/**
	 * Metodo que se utiliza recursivamente, en la busqueda
	 * del camino optimo.
	 * @scope protected.
	 * @param graph de clase Graph*.
	 * @param nodeO de clase Node*, nodo origen.
	 * @param nodeD de clase Node*, nodo destino.
	 * @param prior de tipo int, para saber que peso evaluamos.
	 */
	void searchPath(Graph *graph, Node *nodeO, Node *nodeD,int prior);

public:

	/**
	 * Constructor parametrizado de la clase SearchAlgorithm.
	 */
	SearchAlgorithm(Logger *log);

	/**
	 * Destructor de la clase SearchAlgorithm.
	 */
	virtual ~SearchAlgorithm();

	/**
	 * Metodo que se utiliza a modo de punto de inicio de la busqueda
	 * del camino optimo.
	 * @param graph de clase Graph*.
	 * @param nodeO de clase Node*, nodo origen.
	 * @param nodeD de clase Node*, nodo destino.
	 * @param priority de tipo int, para saber que peso evaluamos.
	 */
	int execute(Graph *graph, Node *nodeO, Node *nodeD, int priority);

	/**
	 * Metodo getter del camino optimo.
	 * @return Retorna el camino optimo.
	 */
	std::string getMinimumPath();
};

#endif /* SEARCHALGORITHM_HPP_ */
